package com.boil.qz.safekavass.service;

import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.dao.MybatisDao;
import com.boil.qz.safekavass.model.WeixinSendredpackEntity;
import com.boil.qz.safekavass.model.WeixinSendredpackRecordEntity;
import com.boil.qz.safekavass.pojo.WeixinGethbinfoParamVo;
import com.boil.qz.safekavass.pojo.WeixinSendredpackParamVo;
import com.boil.qz.safekavass.repository.WeixinSendredpackRepository;
import com.boil.qz.safekavass.weixin.util.WeixinUtils;
import com.boil.util.Constants;
import com.boil.util.DateUtils;
import com.boil.util.Utils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * Created by ChenYong on 2017-05-27.
 * <br>
 * 微信发普通红包 Service。
 */
@Service
public class WeixinSendredpackService extends JpaRepositoryService<WeixinSendredpackEntity, Long> {
    /**
     * 注入 Mybatis Dao
     */
    @Autowired
    private MybatisDao mybatisDao;
    /**
     * 注入微信发普通红包实体仓库
     */
    @Autowired
    private WeixinSendredpackRepository weixinSendredpackRepository;
    /**
     * 注入微信发普通红包记录 Service
     */
    @Autowired
    private WeixinSendredpackRecordService weixinSendredpackRecordService;

    /**
     * 处理微信发普通红包。
     *
     * @param resultVo                 结果 Vo 实例
     * @param weixinSendredpackParamVo 微信发普通红包参数映射实例
     */
    public void doSendredpack(ResultVo resultVo, WeixinSendredpackParamVo weixinSendredpackParamVo) {
        // 当前日期字符串
        String currDateStr = DateUtils.getCurrDateStr(Constants.DATE_FORMAT_7);
        // 查询最大商户订单号
        String maxMch_billno = weixinSendredpackRepository.findMaxMchBillno(String.format("%s%s", WeixinUtils.MCH_ID, currDateStr));

        // 空，表示今天未发红包，商户订单号从 1 开始
        if (StringUtils.isBlank(maxMch_billno)) {
            maxMch_billno = String.format("%s%s%s", //
                    WeixinUtils.MCH_ID, //
                    currDateStr, //
                    Utils.getZerofillStr(Constants.VALUE_1, Constants.VALUE_10));

            // 非空，表示今天已发红包，商户订单号为今天的最大商户订单号 + 1
        } else {
            maxMch_billno = String.format("%s%s%s", //
                    WeixinUtils.MCH_ID, //
                    currDateStr, //
                    Utils.getZerofillStr((Integer.parseInt(maxMch_billno.substring(Constants.VALUE_18)) + Constants.VALUE_1), Constants.VALUE_10));
        }

        weixinSendredpackParamVo.setMch_billno(maxMch_billno);
        weixinSendredpackParamVo.setMch_id(WeixinUtils.MCH_ID);
        weixinSendredpackParamVo.setNonce_str(Utils.getUuid().toUpperCase());
        weixinSendredpackParamVo.setWxappid(WeixinUtils.APP_ID);
        weixinSendredpackParamVo.setSend_name(WeixinUtils.SEND_NAME);
        weixinSendredpackParamVo.setWishing(WeixinUtils.WISHING);
        weixinSendredpackParamVo.setClient_ip(WeixinUtils.CLIENT_IP);
        weixinSendredpackParamVo.setAct_name(WeixinUtils.ACT_NAME);
        weixinSendredpackParamVo.setScene_id(WeixinUtils.SCENE_ID_PRODUCT_4);
        weixinSendredpackParamVo.setRisk_info(Constants.EMPTY_STR);
        weixinSendredpackParamVo.setConsume_mch_id(Constants.EMPTY_STR);
        weixinSendredpackParamVo.setSign(WeixinUtils.getWeixinSendredpackSign(weixinSendredpackParamVo));

        // 调用接口发普通红包
        String sendredpackResultXml = WeixinUtils.sendCertHttpsPost(WeixinUtils.URL_POST_SENDREDPACK, Utils.bean2Xml(weixinSendredpackParamVo));
        // 发普通红包结果
        Map<String, String> sendredpackResultMap = Utils.xml2Map(sendredpackResultXml);
        // 返回状态码
        String return_code1 = sendredpackResultMap.get(WeixinUtils.RETURN_CODE_STR);
        // 返回信息
        String return_msg1 = sendredpackResultMap.get(WeixinUtils.RETURN_MSG_STR);

        // 通信成功
        if (WeixinUtils.SUCCESS_STR.equals(return_code1)) {
            // 发红包实例
            WeixinSendredpackEntity weixinSendredpackEntity = new WeixinSendredpackEntity();
            weixinSendredpackEntity.setReturnCode(return_code1);
            weixinSendredpackEntity.setReturnMsg(return_msg1);
            weixinSendredpackEntity.setResultCode(sendredpackResultMap.get(WeixinUtils.RESULT_CODE_STR));
            weixinSendredpackEntity.setErrCode(sendredpackResultMap.get(WeixinUtils.ERR_CODE_STR));
            weixinSendredpackEntity.setErrCodeDes(sendredpackResultMap.get(WeixinUtils.ERR_CODE_DES_STR));
            weixinSendredpackEntity.setSign(sendredpackResultMap.get(WeixinUtils.SIGN_STR));
            weixinSendredpackEntity.setMchBillno(weixinSendredpackParamVo.getMch_billno());
            weixinSendredpackEntity.setMchId(weixinSendredpackParamVo.getMch_id());
            weixinSendredpackEntity.setWxappid(weixinSendredpackParamVo.getWxappid());
            weixinSendredpackEntity.setReOpenid(weixinSendredpackParamVo.getRe_openid());
            weixinSendredpackEntity.setTotalAmount(weixinSendredpackParamVo.getTotal_amount());

            // 发红包成功
            if (WeixinUtils.SUCCESS_STR.equals(weixinSendredpackEntity.getResultCode())) {
                weixinSendredpackEntity.setSendListid(sendredpackResultMap.get(WeixinUtils.SEND_LISTID_STR));
            }

            // 保存发红包
            save(weixinSendredpackEntity);

            // 包记录参数实例
            WeixinGethbinfoParamVo weixinGethbinfoParamVo = new WeixinGethbinfoParamVo();
            weixinGethbinfoParamVo.setNonce_str(Utils.getUuid().toUpperCase());
            weixinGethbinfoParamVo.setMch_billno(weixinSendredpackEntity.getMchBillno());
            weixinGethbinfoParamVo.setMch_id(weixinSendredpackEntity.getMchId());
            weixinGethbinfoParamVo.setAppid(weixinSendredpackEntity.getWxappid());
            weixinGethbinfoParamVo.setBill_type(WeixinUtils.BILL_TYPE_MCHT);
            weixinGethbinfoParamVo.setSign(WeixinUtils.getWeixinGethbinfoSign(weixinGethbinfoParamVo));

            // 调用接口查询红包记录
            String gethbinfoResultXml = WeixinUtils.sendCertHttpsPost(WeixinUtils.URL_POST_GETHBINFO, Utils.bean2Xml(weixinGethbinfoParamVo));
            // 查询红包记录结果
            Map<String, String> gethbinfoResultMap = Utils.xml2Map(gethbinfoResultXml);
            // 返回状态码
            String return_code2 = gethbinfoResultMap.get(WeixinUtils.RETURN_CODE_STR);
            // 返回信息
            String return_msg2 = gethbinfoResultMap.get(WeixinUtils.RETURN_MSG_STR);

            // 通信成功
            if (WeixinUtils.SUCCESS_STR.equals(return_code2)) {
                // 发红包记录实例
                WeixinSendredpackRecordEntity weixinSendredpackRecordEntity = new WeixinSendredpackRecordEntity();
                weixinSendredpackRecordEntity.setReturnCode(return_code2);
                weixinSendredpackRecordEntity.setReturnMsg(return_msg2);
                weixinSendredpackRecordEntity.setResultCode(gethbinfoResultMap.get(WeixinUtils.RESULT_CODE_STR));
                weixinSendredpackRecordEntity.setErrCode(gethbinfoResultMap.get(WeixinUtils.ERR_CODE_STR));
                weixinSendredpackRecordEntity.setErrCodeDes(gethbinfoResultMap.get(WeixinUtils.ERR_CODE_DES_STR));
                weixinSendredpackRecordEntity.setSign(gethbinfoResultMap.get(WeixinUtils.SIGN_STR));
                weixinSendredpackRecordEntity.setMchBillno(weixinSendredpackParamVo.getMch_billno());
                weixinSendredpackRecordEntity.setMchId(weixinSendredpackParamVo.getMch_id());

                // 查询红包记录成功
                if (WeixinUtils.SUCCESS_STR.equals(weixinSendredpackRecordEntity.getResultCode())) {
                    weixinSendredpackRecordEntity.setDetailId(gethbinfoResultMap.get(WeixinUtils.DETAIL_ID_STR));
                    weixinSendredpackRecordEntity.setStatus(gethbinfoResultMap.get(WeixinUtils.STATUS_STR));
                    weixinSendredpackRecordEntity.setSendType(gethbinfoResultMap.get(WeixinUtils.SEND_TYPE_STR));
                    weixinSendredpackRecordEntity.setHbType(gethbinfoResultMap.get(WeixinUtils.HB_TYPE_STR));
                    weixinSendredpackRecordEntity.setReason(gethbinfoResultMap.get(WeixinUtils.REASON_STR));
                    weixinSendredpackRecordEntity.setSendTime(gethbinfoResultMap.get(WeixinUtils.SEND_TIME_STR));
                    weixinSendredpackRecordEntity.setRefundTime(gethbinfoResultMap.get(WeixinUtils.REFUND_TIME_STR));
                    weixinSendredpackRecordEntity.setWishing(gethbinfoResultMap.get(WeixinUtils.WISHING_STR));
                    weixinSendredpackRecordEntity.setRemark(gethbinfoResultMap.get(WeixinUtils.REMARK_STR));
                    weixinSendredpackRecordEntity.setActName(gethbinfoResultMap.get(WeixinUtils.ACT_NAME_STR));
                    weixinSendredpackRecordEntity.setOpenid(gethbinfoResultMap.get(WeixinUtils.OPENID_STR));
                    weixinSendredpackRecordEntity.setRcvTime(gethbinfoResultMap.get(WeixinUtils.RCV_TIME_STR));

                    if (StringUtils.isNotBlank(gethbinfoResultMap.get(WeixinUtils.TOTAL_NUM_STR))) {
                        weixinSendredpackRecordEntity.setTotalNum(Integer.parseInt(gethbinfoResultMap.get(WeixinUtils.TOTAL_NUM_STR)));
                    }

                    if (StringUtils.isNotBlank(gethbinfoResultMap.get(WeixinUtils.TOTAL_AMOUNT_STR))) {
                        weixinSendredpackRecordEntity.setTotalAmount(Integer.parseInt(gethbinfoResultMap.get(WeixinUtils.TOTAL_AMOUNT_STR)));
                    }

                    if (StringUtils.isNotBlank(gethbinfoResultMap.get(WeixinUtils.REFUND_AMOUNT_STR))) {
                        weixinSendredpackRecordEntity.setRefundAmount(Integer.parseInt(gethbinfoResultMap.get(WeixinUtils.REFUND_AMOUNT_STR)));
                    }

                    if (StringUtils.isNotBlank(gethbinfoResultMap.get(WeixinUtils.AMOUNT_STR))) {
                        weixinSendredpackRecordEntity.setAmount(Integer.parseInt(gethbinfoResultMap.get(WeixinUtils.AMOUNT_STR)));
                    }
                }

                // 保存红包记录
                weixinSendredpackRecordService.save(weixinSendredpackRecordEntity);

                // 发红包成功
                if (WeixinUtils.SUCCESS_STR.equals(return_code1) && //
                        WeixinUtils.SUCCESS_STR.equals(weixinSendredpackEntity.getResultCode()) && //
                        WeixinUtils.SUCCESS_STR.equals(return_code2) && //
                        WeixinUtils.SUCCESS_STR.equals(weixinSendredpackRecordEntity.getResultCode()) && //
                        (WeixinUtils.STATUS_SENDING.equals(weixinSendredpackRecordEntity.getStatus()) || //
                                WeixinUtils.STATUS_SENT.equals(weixinSendredpackRecordEntity.getStatus()) || //
                                WeixinUtils.STATUS_RECEIVED.equals(weixinSendredpackRecordEntity.getStatus()) || //
                                WeixinUtils.STATUS_RFUND_ING.equals(weixinSendredpackRecordEntity.getStatus()) || //
                                WeixinUtils.STATUS_REFUND.equals(weixinSendredpackRecordEntity.getStatus()))) {
                    resultVo.setResultCode(Constants.SUCCESS);
                    resultVo.setResultMsg(WeixinUtils.SUCCESS_SENDREDPACK_MSG);

                    // 发红包失败
                } else {
                    StringBuffer errorMsgSb = new StringBuffer();
                    errorMsgSb.append(Constants.SENDREDPACK_ERROR_MSG);
                    errorMsgSb.append(Constants.NEWLINE_BR);

                    // 发红包失败
                    if (WeixinUtils.SUCCESS_STR.equals(return_code1) && WeixinUtils.FAIL_STR.equals(weixinSendredpackEntity.getResultCode())) {
                        errorMsgSb.append(return_msg1);
                        errorMsgSb.append(Constants.NEWLINE_BR);
                        errorMsgSb.append(weixinSendredpackEntity.getErrCode());
                        errorMsgSb.append(Constants.MINUS_CHAR);
                        errorMsgSb.append(weixinSendredpackEntity.getErrCodeDes());
                    }

                    // 查询红包记录失败
                    if (WeixinUtils.SUCCESS_STR.equals(return_code2) && WeixinUtils.FAIL_STR.equals(weixinSendredpackRecordEntity.getResultCode())) {
                        errorMsgSb.append(Constants.NEWLINE_BR);
                        errorMsgSb.append(return_msg2);
                        errorMsgSb.append(Constants.NEWLINE_BR);
                        errorMsgSb.append(weixinSendredpackRecordEntity.getErrCode());
                        errorMsgSb.append(Constants.MINUS_CHAR);
                        errorMsgSb.append(weixinSendredpackRecordEntity.getErrCodeDes());
                    }

                    resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
                    resultVo.setResultMsg(errorMsgSb.toString());
                }
            }
        }
    }
}